/*
 * CS_MARKET_ITEM_SALE_LIST.cpp
 *
 *  Created on: 2013. 5. 22.
 *      Author: mega@gamevil.com
 */

#include "../../Command.h"
#include "../../User.h"

namespace ProjectZ { namespace NCommand {

void Command::CS_MARKET_ITEM_SALE_LIST(User * pUser, ::Network::Packet * pPacket)
{
/*	// 거래소 아이템 리스트 요청
	CS_MARKET_ITEM_SALE_LIST	0x1002
	{
		s8 class_type;			/// -1 전체
		s8 item_type;			/// 아이템 시트 타입
		s16 item_level_min;		/// 기본값은 본인레벨 client
		s16 item_level_max;		/// -1 없음
		s8 item_qulity;			/// -1 전체 등급
		u8 offset;			// 요청 데이터 시작점(0부터~)
		u8 interval;			// 요청할 개수
	}

	// 거래소 아이템 리스트 요청
	SC_MARKET_ITEM_SALE_LIST	0x1003
	{
		s16 ack;	 			/// 성공(1),  실패(-1), 등록된 데이터 없음(-2)
		u16 searched_item_count;	/// 검색된 아이템 갯수(MAX : 999)
		u8	count
		{
		u64	item_seq;	// 아이템 seq
		u8	class_type;		// 장착클래스 타입
		u8	sub_type;		// 서브타입
		u16	tid;			// 테이블 아이디
		u8	cur_refine_step;	// 현재 제련단계
		u8	level;			// 아이템 레벨
		u8	quality;
		u8	open_upgrade_stone_slot; // 오픈된 강화석 슬롯수
		u8	evolve_step;		 // 진화단계
		u8	evolve_max; 		 // 진화 최대단계
		u8	eff_type0;		 // 0 : + , 1 : %
		u16	eff_value0;		 // 기본이펙트 : 효과치
		u32	sale_price;		 // 판매가격
		s24	sale_id;		 // 판매자 아이디
		u8	sale_due_time;		 // 남은시간(1시간 미만인 경우 0)
		}
	}*/

	PREPARE_PACKET;

	char classType		= 0;
	char sheetType		= 0;
	int16_t minLevel	= 0;
	int16_t maxLevel	= 0;
	char itemQuality	= 0;
	char startIndex		= 0;
	char endIndex		= 0;

	*pPacket >> classType >> sheetType >> minLevel >> maxLevel >> itemQuality >> startIndex >> endIndex;

	int registTotalCount = 0;

	{
		// 조건에 맞는 전체 아이템의 갯수 계산 (클라이언트에서 페이징 처리를 위해)
		::Database::Command::Auto clsAuto(::Database::GETCOMMANDPOOL());
		clsAuto->SetQueryType(::Database::Command::S_PROCEDURE);
		clsAuto->MakeQuery("call sp_select_trade_item_count(%d,%d,%d,%d,%d,%d)",
				classType, sheetType, minLevel, maxLevel, itemQuality, pUser->GetUserSeq());

		DEBUGLOG("CS_MARKET_ITEM_SALE_LIST : %s", clsAuto->GetQueryString());

		if (false == ::Database::GETSESSION()->SyncExecute(static_cast<int>(DatabaseType::TRADE_SLAVE), clsAuto))
		{
			DEBUGLOG("CS_MARKET_ITEM_SALE_LIST : false == ::Database::GETSESSION()->SyncExecute(1, clsAuto) Count!!");
			return;
		}

		if (clsAuto->GetErrorIdx() != 0)
		{
			DEBUGLOG("CS_MARKET_ITEM_SALE_LIST : clsAuto->GetErrorIdx() != 0 Count!!");
			return;
		}

		while (clsAuto->Next())
		{
			clsAuto->GetRecord() >> registTotalCount;
		}
	}


	{
		// 거래소에 등록된 아이템 정보 조회
		::Database::Command::Auto clsAuto(::Database::GETCOMMANDPOOL());
		clsAuto->SetQueryType(::Database::Command::S_PROCEDURE);
		clsAuto->MakeQuery("call sp_select_trade_item(%d,%d,%d,%d,%d,%d,%d,%d)",
				classType, sheetType, minLevel, maxLevel, itemQuality, startIndex, endIndex, pUser->GetUserSeq());

		DEBUGLOG("CS_MARKET_ITEM_SALE_LIST : %s", clsAuto->GetQueryString());

		if (false == ::Database::GETSESSION()->SyncExecute(static_cast<int>(DatabaseType::TRADE_SLAVE), clsAuto))
		{
			DEBUGLOG("CS_MARKET_ITEM_SALE_LIST : false == ::Database::GETSESSION()->SyncExecute(1, clsAuto)");
			return;
		}

		if (clsAuto->GetErrorIdx() != 0)
		{
			DEBUGLOG("CS_MARKET_ITEM_SALE_LIST : clsAuto->GetErrorIdx() != 0");
			return;
		}

		::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
		*pAck << static_cast<int16_t>(ACK_OK);
		*pAck << static_cast<uint16_t>(registTotalCount);
		*pAck << static_cast<uint8_t>(clsAuto->ResultRowCount());

		while (clsAuto->Next())
		{
			uint64_t tradeSeq		= 0;
			uint16_t tid			= 0;
			char curRefineStep		= 0;
			char level				= 0;
			char quality			= 0;
			char openUpstoneSlot	= 0;
			char evolveStep			= 0;
			char evolveMax			= 0;
			char effType_0			= 0;
			uint16_t effValue_0		= 0;
			int itemPrice			= 0;
			char remainHour			= 0;
			Toolkit::Str<24> nickname;

			clsAuto->GetRecord() >> tradeSeq >> itemPrice >> tid >> curRefineStep
					>> quality >> openUpstoneSlot >> evolveStep >> evolveMax
					>> effType_0 >> effValue_0 >> nickname >> level >> remainHour;

			*pAck << tradeSeq << classType << sheetType << tid << curRefineStep
					<< level << quality << openUpstoneSlot << evolveStep << evolveMax
					<< effType_0 << effValue_0 << itemPrice << nickname.c_str() << remainHour;
		}

		pAck->MakePacket(CMD_SC_MARKET_ITEM_SALE_LIST);
		pUser->Send(pAck);
	}
}

} /*NCommand*/ } /*ProjectZ*/
